//函数作为类型？？ 可以把这个类型的函数当做值来传递
//在go里面，函数也是一种变量，变量会有所属的类型
//上面定义的两个函数都是所有拥有相同的参数，相同的返回值的一种类型
package main

import (
	"fmt"
)

func isOdd(num int) bool {
	if num%2 == 0 {
		return false
	}
	return true
}

func isEven(num int) bool {
	if num%2 == 0 {
		return true
	}
	return false
}

//声明了一个函数类型
type testInt func(int) bool

//上面声明的函数类型testInt在下面运用到了
func filter(slice []int, f testInt) []int {
	var result []int
	for _, value := range slice {
		if f(value) {
			result = append(result, value)
		}
	}
	return result
}

func main() {
	slice := []int{1, 2, 3, 4, 5, 6, 7}
	fmt.Println("slice = ", slice)
	odd := filter(slice, isOdd)
	fmt.Println(odd)
	even := filter(slice, isEven)
	fmt.Println(even)
}
